package cn.js.sangu.unitStore.service;

import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import cn.js.sangu.unitStore.common.exception.ServiceException;
import cn.js.sangu.unitStore.entity.ProcessNode;
import cn.js.sangu.unitStore.mapper.ProcessNodeMapper;
import lombok.extern.slf4j.Slf4j;

/**
 * 流程节点服务实现类
 * 提供流程节点的CRUD操作和业务逻辑处理
 */
@Slf4j
@Service
public class ProcessNodeService extends ServiceImpl<ProcessNodeMapper, ProcessNode> {

    /**
     * 根据模板ID获取节点列表
     * @param templateId 模板ID
     * @return 节点列表
     * @throws ServiceException 当模板ID无效或查询失败时抛出
     */
    public List<ProcessNode> getNodesByTemplateId(Integer templateId) {
        try {
            Assert.notNull(templateId, "模板ID不能为空");
            return this.lambdaQuery()
                    .eq(ProcessNode::getTemplateId, templateId)
                    .orderByAsc(ProcessNode::getStep) // 按步骤顺序排序
                    .list();
        } catch (IllegalArgumentException e) {
            throw new ServiceException(e.getMessage());
        } catch (Exception e) {
            log.error("根据模板ID获取节点列表失败，templateId: {}", templateId, e);
            throw new ServiceException("获取节点列表失败，请联系管理员");
        }
    }

    /**
     * 根据模板ID删除节点
     * @param templateId 模板ID
     * @return 是否删除成功
     * @throws ServiceException 当模板ID无效或删除失败时抛出
     */
    public boolean removeByTemplateId(Integer templateId) {
        try {
            Assert.notNull(templateId, "模板ID不能为空");
            return this.lambdaUpdate()
                    .eq(ProcessNode::getTemplateId, templateId)
                    .remove();
        } catch (IllegalArgumentException e) {
            throw new ServiceException(e.getMessage());
        } catch (Exception e) {
            log.error("根据模板ID删除节点失败，templateId: {}", templateId, e);
            throw new ServiceException("删除节点失败，请联系管理员");
        }
    }
}